/*
通过指针引用数组
可以用一个指针变量指向一个数组元素。例如：
int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p;
p=&a[0];//地址 
以上是使指针变量p指向a数组的第0号元素。
在c语言中，数组名（不包括形参数组名，形参数组并不占据实际的内存单元）
代表数组中首元素（即序号为0的元素）的地址。因此，下面两个语句等价：
p=&a[0];  //p的值是a[0]的地址
p=a;      //p的值是数组a首元素（即a[0]）的地址  这里 a代表 &a[0] 
注意：数组名不代表整个数组，只代表数组首元素的地址。
上述p=a;的作用是“把a数组的首元素的地址赋给指针变量p”，而不是“把数组a各元素的值赋给p”。
p+1所代表的地址实际上是p+1*d，d是一个数组元素所占的字节数。若p的值是2000，则p+1的值不是2001而是2004。
如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址
a代表数组首元素的地址，a+1也是地址，它的计算方法同p+1，即它的实际地址为a+1*d。例如，p+9和a+9的值是&a[9],它指向a[9]
3）*（p+i）和*(a+i)是p+i或a+i所指向的元素，即a[i]。例如*(p+5)和*(a+5)就是a[5]，三者等价。
*/ 

#include<stdio.h>
int main()
{
    int a[10];//数组 
    int i;
    printf("please enter 10 integer numbers: ");
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);

    for(i=0;i<10;i++)
    printf("%d\t",a[i]);    //数组元素用数组名和下标表示  c编译系统是将a[i]装换为*（a+i）处理

    for(i=0;i<10;i++)
    printf("%d\t",*(a+i));  //通过数组名和元素序号计算元素地址，再找该元素  a=&a[0]
    
    //   前两种方法用时时相同  先计算元素的地址
    
    
   //  变量表示当期的地址
   /*  
    for(i=0;i<10;i++)
    scanf("%d",&a[i]);
    可以修改为：
    for(p=a;p<(a+10);p++)
    scanf("%d",p);
   */
// 用指针变量直接指向元素，不必每次都重新计算地址,速度快 
    int *p;
    for(p=a;p<(a+10);p++) // p a p+i  a+i 均为地址  按照数据类型的存储单位 增加 
    printf("%d\t",*p);      //用指针指向当前的数组元素
	
	return 0;    
    
}
